package data;

import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.JFrame;
import dr.ihm.Window;
import dr.joueurs.Humain;
import dr.joueurs.IA;
import dr.joueurs.Joueur;
import dr.moteur.BaseAbstraite;
import dr.moteur.GameEngine;
import dr.moteur.GameEngineClient;
import dr.moteur.Zone;
import dr.util.GameSetup;
import dr.util.GrapheChemin;
/**
 * Game est la classe principale de l'application, elle permet d'instancier les differents elements du jeu 
 * 
 * @author David Ciaudo, Malika Papillon, Claire Pouenat, Gregoire Tarizzo et Marlene Richier
 * @version v1.0 beta
 * */
public class Game{


	public static boolean debug_setup_claire = false;
	public static boolean debug_no_map = false;
	public static boolean debug_no_textures = false;
	public static boolean debug_display = false;
	public static boolean debug_zones = false;
	/**
	 * Graphe representant les bases et les chemins construits entre elles
	 */
	private static GrapheChemin graph;
	/**
	 * booleen permettant de savoir qd demarrrer la partie (joueur = true)
	 */
	public static boolean jouer = false;


	public static void main(String[] args) {
		
		GameEngine GE = new GameEngine();

		/////Declaration de la fenetre de jeu//////////////////
		Window window = new Window("Desert Rush",1675,1675,(GameEngineClient)GE);
		
		
		/* ~~ ON LANCE L'INTERFACE DE MISE EN PLACE DU JEU (NOUVELLE PARTIE) ~~ */
		while (!jouer){
			
			window.set_start_ihm();
			
		}
		
		String config;
		/*~~ LA ON RECUPERE LE FICHIER DE CONFIGURATION CHOISI PAR L UTILISATEUR ~~*/
		//System.out.println(window.f_start.getCarte());
		config = new String (window.f_start.getCarte());
		GameSetup GS = new GameSetup(config, GE);

		//mise a jour du graphe
		graph = GS.get_graphe();

		//if (Game.debug_setup_claire) System.out.println(GS.get_map());
		//if (Game.debug_setup_claire) System.out.println(GS.get_h_map());

		
		// Création des joueurs 
		int nb_j = 0;
		if (!(window.f_start.isStatus_obs())){ // joue
			//System.out.println("JOUEUR");
			Joueur j= new Humain(nb_j, window.f_start.getArgent_init(),window.f_start.getNom_joueur());
			GE.getListeJoueurs().addLast(j);
			nb_j ++;
		}else{/*System.out.println("PASJOUEUR");*/}
		for (int i= nb_j; i<GS.getNb_joueurs(); i++){
			//creation des ia
			Joueur j= new IA(GE, "IA"+(i-nb_j) , i, window.f_start.getArgent_init());
			GE.getListeJoueurs().addLast(j);
		}
		
		//attribuer des bases au joueurs
		Iterator<BaseAbstraite> iter = GE.getListeBases().iterator(); 
		int cpt_b=0;
		int id_joueurs = 0;
	    while (iter.hasNext()&&id_joueurs<GS.getNb_joueurs()){
	    	BaseAbstraite b = iter.next();
	    	if (b.getNom().equalsIgnoreCase("QG")){
	    		GE.getListeBases().get(cpt_b).setIdJoueur(id_joueurs);
	    		id_joueurs ++;
	    	}
	    	cpt_b ++;
	    }


		/*Joueur j1= new Joueur(1, GS.get_argent_init_j());
		Joueur j2= new Joueur(2, GS.get_argent_init_j());
		Joueur j3= new Joueur(3, GS.get_argent_init_j());
		Joueur j4= new Joueur(0, GS.get_argent_init_j());

		GE.getListeJoueurs().addLast(j1);
		GE.getListeJoueurs().addLast(j2);
		GE.getListeJoueurs().addLast(j3);
		GE.getListeJoueurs().addLast(j4);
	*/

/*
		GE.getListeBases().get(0).setIdJoueur(0);
		GE.getListeBases().get(1).setIdJoueur(1);
		GE.getListeJoueurs().get(0).setOr(3000);
		
*/
		//Test pour eviter les arreurs au chargement
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//System.out.println(GE.getListeBases().get(10).getIdJoueur());
		boolean continuer=true;
		long tempsStocke=0;
		long temps=0;

		window.set_jeu_ihm();
		while(continuer){
			window.f_jeu.updateMiniMap(window.f_jeu.updateViewport());
			temps=System.currentTimeMillis();
			for(int i=0; i<GE.getListeTours().size();i++){
				GE.getListeTours().get(i).sauverEffet();
				GE.getListeTours().get(i).appliquerEffets();
			}
			for(int i=0; i<GE.getListeAgents().size();i++){
				GE.getListeAgents().get(i).sauverEffet();
				GE.getListeAgents().get(i).appliquerEffets();
			}
			GE.update();
			if(temps-tempsStocke>16.0){
				/*if(GE.getListeTours().size()!=0){
					System.out.println("portee avant de rentrer dans le repaint : "+GE.getListeTours().get(0).getPortee());
				}*/
				window.f_jeu.area.repaint();
				tempsStocke=temps;
			}
			for(int i=0; i<GE.getListeTours().size();i++){
				GE.getListeTours().get(i).retirerEffet();
			}
			for(int i=0; i<GE.getListeAgents().size();i++){
				GE.getListeAgents().get(i).retirerEffet();
			}
		}
	}
}